#pragma once

#include<iostream>
#include<string>
#include<pthread.h>

enum class Status
{
    NEW=0,
    RUNNING,
    EXIT
};

typedef void (*func_t)(void*)

class Thread
{
public:
    Thread(int num=0,func_t func=nullptr,void* args=nullptr)
    :_tid(0),_func(func),_args(args),_status(Status::NEW)
    {
        char name[128];
        snprintf(name,sizeof(name),"thread-%d",num);
        _name=name;
        
    }
    ~Thread()
    {}

    //获取ID
    pthread_t getTid() const{
        return _tid;
    }

    //获取线程名
    std::string getName() const{
        return _name;
    }

    //获取状态
    Status getStatus() const{
        return _status;
    }

    //回调函数
    static void* runHelper(void* args)
    {
        Thread* mythis=static_cast<Thread*>(args);

        mythis->_func(myThis->_args);
    }

    //启动线程
    void run()
    {
        int ret=pthread_create(&_tid,nullptr,runHelper,this);
        if(ret!=0)
        {
            perror("pthread_create fail");
            exit(1);
        }
        _status=Status::RUNNING;

    }

    //线程等待
    void join()
    {
        int ret=pthread_join(_tid,nullptr);
        if(ret!=0)
        {
            perror("pthread_join fail");
            exit(1);
        }
        _status=Status::EXIT;
    }
private:
    pthread_t _tid;//线程ID
    func_t _func;//线程回调函数
    void* _args;//传递给回调函数的参数

    std::string _name;//线程名
    Status _status;//线程状态
}

